import { defineStore } from 'pinia';
import { computed, ref } from 'vue';
import router from "@/router";
import { removeToken, setToken } from '@/utils/auth';
import { userInfoService } from "@/api/user";

export const useUserInfoStore = defineStore('userInfo', () => {
    const userInfo = ref({});
    const isLoggedIn = ref(false); // 保留登录状态

    const isAdmin = computed(() => {
        return userInfo.value && userInfo.value.permission === 1;
    });

    const setUserInfo = (newUserInfo) => {
        userInfo.value = { ...newUserInfo };
        isLoggedIn.value = true; // 同步更新登录状态
    };

    const removeUserInfo = () => {
        userInfo.value = {};
        isLoggedIn.value = false;
        removeToken();
    };

    const loginSuccess = async (token) => {
        // 第一步：先设置 Token。这个是同步写入，会立刻执行。
        console.log('loginSuccess接收的token:', token);
        setToken(token);

        // 第二步：再尝试获取用户信息。
        // 因为上一步已经完成，所以这次发请求时，拦截器一定能拿到新 Token。
        try {
            const res = await userInfoService(); // 这个请求现在是安全的
            if (res.success && res.data) {
                // 用户信息获取成功，一切顺利！
                setUserInfo(res.data);
                // 最后，跳转页面
                await router.push('/user/info');
            } else {
                // Token有效，但获取用户信息失败（比如后端逻辑问题），也算登录失败
                ElMessage.error(res.message || '获取用户信息失败，请重试');
                // 清理掉无效的token并退回到登录页
                logout();
            }
        } catch (err) {
            // 如果 userInfoService() 请求直接报错（比如网络问题），在这里捕获
            console.error('在登录成功后获取用户信息时失败:', err);
            // request.js的拦截器应该已经弹过错了，我们这里只负责清理现场
            logout();
        }
    };

    const fetchUserInfo = async () => {
        try {
            const res = await userInfoService();
            if (res.success) {
                setUserInfo(res.data);
            } else {
                logout(); // 获取用户信息失败视为未登录
            }
        } catch (err) {
            console.error('获取用户信息失败:', err);
        }
    };

    const logout = () => {
        removeUserInfo();
        router.push('/login');
    };

    const $reset = () => {
        userInfo.value = {};
        isLoggedIn.value = false;
    };

    return {
        userInfo,
        isLoggedIn, // 保留
        isAdmin,    // 保留
        setUserInfo,
        removeUserInfo,
        fetchUserInfo,
        loginSuccess,
        logout,
        $reset
    };
}, {
    persist: true
});